import requests
import json
import re


class CommunityRepairAssistant:
    def __init__(self, api_key=None):
        """
        初始化DeepSeek API设置
        注意：DeepSeek API可能需要申请，部分平台提供免费试用:cite[7]
        """
        self.api_url = "https://api.deepseek.com/v1/chat/completions"  # 假设的API端点，请以实际为准
        self.api_key =  "sk-8751514eba5c42a0bfb3fe083b09bf6e"  # 你的DeepSeek API密钥
        self.headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }

        # 定义报修流程所需的信息字段
        self.required_info = {
            "building_number": None,  # 楼栋号
            "unit_number": None,  # 单元号
            "room_number": None,  # 房间号
            "problem_type": None,  # 问题类型（如灯坏了）
            "problem_details": None,  # 问题详情
            "contact_info": None  # 联系方式
        }

        # 系统提示词 - 这是引导模型行为的关键:cite[1]:cite[6]
        self.system_prompt = """
        你是一个社区报修助手，负责引导用户提供报修所需的所有信息。
        报修流程分为以下步骤：
        1. 确认用户需要报修（例如房间灯坏了）
        2. 收集楼栋号
        3. 收集单元号
        4. 收集房间号
        5. 了解具体哪里坏了和详细情况
        6. 确认联系方式

        每次只询问一个信息点，除非用户主动提供多个信息。
        对话应该友好、专业，并引导用户逐步提供所有必要信息。
        当收集到所有信息后，确认信息是否正确，然后生成报修工单。

        以下是必须收集的信息字段：
        - 楼栋号 (building_number)
        - 单元号 (unit_number)
        - 房间号 (room_number)
        - 问题类型 (problem_type)
        - 问题详情 (problem_details)
        - 联系方式 (contact_info)
        """

        # 初始化对话历史
        self.conversation_history = [{"role": "system", "content": self.system_prompt}]

    def call_deepseek_api(self, user_message):
        """
        调用DeepSeek API获取回复
        """
        # 添加用户消息到对话历史
        self.conversation_history.append({"role": "user", "content": user_message})

        payload = {
            "model": "deepseek-chat",  # 使用适合的DeepSeek模型
            "messages": self.conversation_history,
            "temperature": 0.3,  # 较低的温度值以保证输出更加可控
            "max_tokens": 500
        }

        try:
            response = requests.post(self.api_url, headers=self.headers, data=json.dumps(payload))
            response.raise_for_status()
            result = response.json()
            assistant_reply = result['choices'][0]['message']['content']

            # 添加助手回复到对话历史
            self.conversation_history.append({"role": "assistant", "content": assistant_reply})

            return assistant_reply

        except Exception as e:
            return f"调用API时出错: {str(e)}"

    def extract_info(self, text):
        """
        从用户输入中提取结构化信息
        使用正则表达式和关键词匹配来提取可能的信息
        """
        # 提取楼栋号（例如：1栋、2号楼等）
        building_match = re.search(r'(\d+)[栋号楼]', text)
        if building_match:
            self.required_info['building_number'] = building_match.group(1)

        # 提取单元号（例如：1单元、单元2等）
        unit_match = re.search(r'(\d+)[单元元]|单元\s*(\d+)', text)
        if unit_match:
            self.required_info['unit_number'] = unit_match.group(1) or unit_match.group(2)

        # 提取房间号（例如：101室、房间202等）
        room_match = re.search(r'(\d+)[室号]|房间\s*(\d+)', text)
        if room_match:
            self.required_info['room_number'] = room_match.group(1) or room_match.group(2)

        # 检查是否包含问题描述关键词
        problem_keywords = ['灯坏了', '漏水', '断电', '堵塞', '损坏', '坏了', '故障']
        for keyword in problem_keywords:
            if keyword in text:
                self.required_info['problem_type'] = keyword
                break

        # 提取联系方式（手机号）
        phone_match = re.search(r'1[3-9]\d{9}', text)
        if phone_match:
            self.required_info['contact_info'] = phone_match.group(0)

    def is_info_complete(self):
        """
        检查是否已收集所有必要信息
        """
        return all(value is not None for value in self.required_info.values())

    def generate_repair_order(self):
        """
        生成报修工单
        """
        if not self.is_info_complete():
            missing_fields = [key for key, value in self.required_info.items() if value is None]
            return f"信息不完整，缺少: {', '.join(missing_fields)}"

        repair_order = {
            "工单类型": "物业报修",
            "报修时间": "2025-09-09 10:30:00",  # 应使用实际时间
            "楼栋号": self.required_info['building_number'],
            "单元号": self.required_info['unit_number'],
            "房间号": self.required_info['room_number'],
            "问题类型": self.required_info['problem_type'],
            "问题详情": self.required_info['problem_details'] or self.required_info['problem_type'],
            "联系方式": self.required_info['contact_info'],
            "工单状态": "待处理",
            "工单编号": f"WR{self.required_info['building_number']}{self.required_info['unit_number']}{self.required_info['room_number']}{int('20250909103000')}"
            # 示例编号
        }

        return json.dumps(repair_order, ensure_ascii=False, indent=2)

    def run_conversation(self):
        """
        运行对话流程
        """
        print("社区报修助手：您好！我是社区报修助手，请问有什么需要帮助的吗？")

        while not self.is_info_complete():
            user_input = input("您：")

            # 如果用户输入退出命令，则结束对话
            if user_input.lower() in ['退出', '结束', 'quit', 'exit']:
                print("社区报修助手：感谢您使用报修服务，再见！")
                return

            # 从用户输入中提取信息
            self.extract_info(user_input)

            # 调用DeepSeek API获取回复
            assistant_reply = self.call_deepseek_api(user_input)
            print(f"社区报修助手：{assistant_reply}")

        # 所有信息已收集完毕，生成工单
        print("\n社区报修助手：所有信息已收集完毕！")
        repair_order = self.generate_repair_order()
        print(f"生成的报修工单：\n{repair_order}")

        # 这里可以添加将工单发送到物业系统的代码
        print("工单已自动提交到物业系统，我们会尽快处理您的报修请求。")


# 使用示例
if __name__ == "__main__":
    assistant = CommunityRepairAssistant()
    assistant.run_conversation()